 //导入express
 const express =  require('express')
 const path = require('path')
 //创建服务器的实例对象
 const app = express()
 const bodyParser =  require('body-parser')
 //导入cors并配置cors中间件实现跨域
 const cors  = require('cors') 
 

   app.use(express.static(path.join(__dirname,'dist')))
   app.get('/',function(req,res){
     res.sendFile(path.join(__dirname + '/dist/index.html'))
   })

 //注册为全局可用的中间件
 app.use(cors())
//  // 中间件
// app.use(cors({
//   origin: process.env.NODE_ENV === 'production' 
//     ? [process.env.CLIENT_ORIGIN] 
//     : '*'
// }))
//  socket.io  使用
const { createServer } = require("http")

  //一定要在路由之前配置解析 Token 的中间件
  const {expressjwt:expressJWT} = require('express-jwt')
  const config = require('./config')
  const joi = require('joi')

  const httpServer = createServer(app)
// Socket.IO
const initSocket = require('./socket/index');
initSocket(httpServer)
     //配置解析表单数据的中间件
 //注意：这个中间件只能解析 application/x-www-from-urlencoded 格式的表单数据
 app.use(express.urlencoded({extended:false}))
 app.use(express.json({ limit: '5mb' }))

// //  multer 是一个 Node.js 中间件 ,用于处理 multipart/form/data 类型的表单数据, 主要用于文件上传
//  const multer = require('multer')
// //   在 server 服务端下新建一个 public 文件,在public 文件下 新建 upload文件用于存放图片
//  const upload = multer({dest:'./public/uploads'})

 // 设置静态文件目录
app.use(express.static('public'));
 
//  app.use(upload.any())
// 配置静态文件服务
app.use(express.static(path.join(__dirname, 'public')));


// 设置安全相关的响应头
app.use((req, res, next) => {
    res.setHeader('X-Content-Type-Options', 'nosniff');
    res.setHeader('X-Frame-Options', 'DENY'); // 防止点击劫持
    res.setHeader('Content-Security-Policy', "default-src 'self'"); // 内容安全策略
    res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains'); // 强制 HTTPS
    next();
})


 //一定要在路由之前，封装 res.cc 函数  
 app.use((req,res,next)=>{
    // status 的默认值为 1 ，表示失败的情况
    // err 的值，可能是一个错误的对象，也可能是一个错误的描述字符串
    res.cc = function(err,status= 401 ){
       res.send({
        status,
        // err 是否是 Error 的实例 ，是的话返回 err.message 否则 返回 err字符串  
        message: err instanceof Error ? err.message : err
       })
    }
    next()
 })

  //定义错误级别的中间件
  app.use((req,res,err,next)=>{
   // 验证失败导致的错误
   // err 是 joi.ValidationError 的实例 则验证失败
   if(err instanceof joi.ValidationError) return res.cc(err)
   // 身份认证失败后的错误
   if(err.name === 'UnauthorizedError') return res.cc('身份认证失败!')
    
  //未知的错误
   res.cc(err)
})

  app.use(expressJWT( {secret:config.jwtSecretKey,algorithms:['HS256'] }).unless({ path: [
      /^\/api/, // 排除以 /api 开头的路径
      /^\/public\/uploads/ // 排除以 /public/uploads 开头的路径
    ]}))
 




 app.use('/public/uploads', express.static(path.join(__dirname, 'public/uploads')))   
  //  导入并使用用户路由模块
 const userRouter = require('./router/login')
 app.use('/api',userRouter)
 

/**
 * @parmas 端口号 处理函数
 * app.listen()
 */
// app.listen(4000,()=>{
   
    
// })


httpServer.listen(4000, () => {
  console.log(`HTTP 服务器运行在 http://localhost:4000`);
})
// // 读取证书文件
// const options = {
//   key: fs.readFileSync('./ssl/privkey.pem'),
//   cert: fs.readFileSync('./ssl/fullchain.pem')
// };

// // 启动 HTTPS 服务器
// https.createServer(options, app).listen(4000, () => {
//   console.log('HTTPS 服务器运行在 4000 端口');
//